package generic;

import java.util.ArrayList;
import java.util.List;

/**
 * @author DCSGO
 * @version 1.0
 * 泛型使用的注意事项和细节
 */
public class GenericDetail {
    //1. interface List<T>{}  public class HashSet<E>{}等等
    // 说明: T,E 只能是引用类型
    //看看下面语句是否正确?
    // List<Integer> list = new ArrayList<Integer>();
    // List<int> list2 = new ArrayList<int>();
    //2.在指定泛型具体类型后 可以传入该类型或者其子类类型
    //3.泛型使用形式
    //List<Integer> list1 =new ArrayList<Integer>();
    //List<Integer> list2 = new ArrayList<>();(推荐)
    //3.如果我们这样写 List list3 = new ArrayList();
    //  默认给它的泛型是 <E> E就是 Object (这也是之前用迭代器 与 foreach
    //  接受元素用 Object 的根本原因
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        //List<int> list2 = new ArrayList<int>();
        //编译错误 类型参数不能为基本数据类型

        List<Animal> list1 = new ArrayList<Animal>();
        list1.add(new Pig());//指定类型为 Animal 但传入的是子类 Pig
        System.out.println(list1);//[generic.Pig@1b6d3586]

        List<Integer> list2 = new ArrayList<Integer>();
        List<Integer> list3 = new ArrayList<>();
        //编译器会进行类型推断 实际上与上面一行代码是一样的
    }
}

class Animal {
    String name;
    int age;
}

class Pig extends Animal {
    double weight;
}
